/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package converter;

import java.sql.Date;
import java.util.Calendar;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import utility.ResourceBundleLoader;

/**
 *
 * @author Carmela
 */
@FacesConverter(forClass = Date.class)
public class DataConverter implements Converter {

    private void lanciaEccezione(ResourceBundle rb, String messaggioResource) {
        FacesMessage messaggio = new FacesMessage();
        messaggio.setSummary(rb.getString(messaggioResource));
        messaggio.setSeverity(FacesMessage.SEVERITY_ERROR);
        throw new ConverterException(messaggio);
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        int i = 0;
        int giorno = 0, mese = 0, anno = 0;
        boolean isParsered = false;
        ResourceBundle rb = ResourceBundleLoader.getResourceBundle(context);
        Date res = null;
        if (value != null) {
            if (value.length() != 10) {
                lanciaEccezione(rb, "dataValidatorM");
            }
            StringTokenizer st = new StringTokenizer(value, "/");
            while (st.hasMoreTokens()) {
                isParsered = true;
                String token = st.nextToken();
                switch (i) {
                    case 0:
                        giorno = Integer.parseInt(token);
                        if (giorno <= 0) {
                            lanciaEccezione(rb, "dataValidationGiornoNonValido");
                        }
                        break;
                    case 1:
                        mese = Integer.parseInt(token);
                        if (mese <= 0) {
                            lanciaEccezione(rb, "dataValidationMeseNonValido");
                        }
                        break;
                    case 2:
                        anno = Integer.parseInt(token);
                        if (anno <= 1930) {
                            lanciaEccezione(rb, "dataValidationAnnoNonValido");
                        }
                        break;
                }
                i++;
            }
            if (isParsered) {
                if (giorno > 31) {
                    this.lanciaEccezione(rb, "dataValidationGiornoNonValido");
                }
                if (mese > 12) {
                    this.lanciaEccezione(rb, "dataValidationMeseNonValido");
                }
                if (mese == 2 && giorno > 29) {
                    this.lanciaEccezione(rb, "dataValidationGiornoNonValido");
                }
                Calendar c = new java.util.GregorianCalendar(anno, mese - 1, giorno);
                res = new Date(c.getTimeInMillis());
            }
        }
        return res;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        String res = null;
        if (value != null) {
            if (value instanceof Date) {
                Date d = (Date) value;
                Calendar c = new java.util.GregorianCalendar();
                c.setTimeInMillis(d.getTime());
                String giorno, mese = "", anno;
                if (c.get(Calendar.DAY_OF_MONTH) < 10) {
                    giorno = "0" + c.get(Calendar.DAY_OF_MONTH);
                } else {
                    giorno = "" + c.get(Calendar.DAY_OF_MONTH);
                }
                if ((c.get(Calendar.MONTH) + 1) < 10) {
                    mese = "0" + (c.get(Calendar.MONTH) + 1);
                } else {
                    mese = "" + (c.get(Calendar.MONTH) + 1);
                }
                anno = "" + c.get(Calendar.YEAR);
                res = giorno + "/" + mese + "/" + anno;
            }
        }
        return res;
    }
}
